--[[--
- @Copyright (C), 2016-, sixiong.
- @Name router.lua
- @Author sixiong
- @Version 1.0
- @Date: 2016年6月11日下午22:06:41
- @Description 路由器
- @Class
- @Function List
- @History <author> <time> <version > <desc>
            sixiong 2016年6月11日下午22:06:41  1.0  第一次建立该文件
--]] 
router = router or {} 
 
--[[--
- @desc 路由分发 
- @param string uri 除域名以外的url
- return bool
--]]
function router.dispatch(uri)
	local path = split(uri, '/');
	
	if #path <= 0 then
	      _URI  = _CONF["site"]["default_controller"] .. '/' .. _CONF["site"]["default_action"];  --更正当前url
	     _BASE['uri'] =  _URI;
		 _BASE['controller'] = _CONF["site"]["default_controller"]; 
		 _BASE['action'] = _CONF["site"]["default_action"]; 
	     return router.call(_CONF["site"]["default_controller"], _CONF["site"]["default_action"]); 
	else
	     path[2] = (path[2]) or (_CONF["site"]["default_action"]);
		 _URI  = path[1]  .. '/' .. path[2]; --更正当前url 
		 _BASE['uri'] =  _URI;
		 _BASE['controller'] = path[1]; 
		 _BASE['action'] = string.gsub(path[2], '.html', '');   --默认后缀 .html 
 
		 local boot = require(_APP..'.boot.init');  
		 boot:init(); --初始化 
	     return router.call(_BASE['controller'], _BASE['action']); 
	end
end
 
 
--[[
- @desc 调用相应的控制器方法
- @param string uri 除域名以外的url
- return bool
--]]
function router.call(controller, action)
    controller = string.lower(controller);
    action = string.lower(action);
    
	local f = _PATH.._APP..'/controllers/' .. controller .. '.lua'; 
	if file_exists(f) then 
		local class = _DEBUG and dofile(f) or require(_APP..'.controllers.' .. controller);  
		if type(class) ~= 'table' then
			  error_handler.fatal("你忘了 return 控制器 table  : " .. f .. "?");
		elseif class[action] and type(class[action]) == 'function' then 
             class:init();
			 class[action](class);
			 return true;
		else 
			 error_handler.fatal("控制器 [" .. controller .. "]  里面没有方法 : " .. action);
		end
	else 
	    dump("文件" .. f .. "不存在");
	    return error_handler.empty(); 
	end
	return true;
end

return router;